/**
 * The contents of this file are subject to the OpenMRS Public License
 * Version 1.0 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://license.openmrs.org
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific language governing rights and limitations
 * under the License.
 *
 * Copyright (C) OpenMRS, LLC.  All Rights Reserved.
 */

package org.openmrs.module.datalogging.web.controller;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonEncoding;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.openmrs.api.context.Context;
import org.openmrs.module.datalogging.model.LogEvent;
import org.openmrs.module.datalogging.service.DataLoggingService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;

/**
 *
 */
@Controller
@RequestMapping("/module/datalogging/findLogEvent")
public class LogEventFinderController {

	/**
	 * Logger for this class and subclasses
	 */
	private static final Log log = LogFactory.getLog(EventListController.class);

	private static final String DATE_FORMAT = "dd-MMM-yyyy";

	@RequestMapping(method = RequestMethod.GET)
	public void preparePage(@RequestParam(required = false, value = "iDisplayStart") Integer displayStart,
	                        @RequestParam(required = false, value = "iDisplayLength") Integer displayLength,
	                        @RequestParam(required = false, value = "sEcho") Integer echo,
	                        @RequestParam(required = false, value = "sSearch") String search, HttpServletResponse response,
	                        HttpServletRequest request) throws IOException {
		if (Context.isAuthenticated()) {

			if (log.isDebugEnabled())
				log.debug("Creating event list ...");

			response.setContentType("application/json");

			DataLoggingService service = Context.getService(DataLoggingService.class);
			List<LogEvent> events = service.findEvents(StringUtils.trim(search), displayStart, displayLength);
			Integer eventCount = service.countEvents(StringUtils.EMPTY);
			Integer filtered = service.countEvents(StringUtils.trim(search));

			SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT);

			JsonFactory factory = new JsonFactory();
			JsonGenerator generator = factory.createJsonGenerator(response.getOutputStream(), JsonEncoding.UTF8);
			generator.useDefaultPrettyPrinter();

			generator.writeStartObject();
			generator.writeArrayFieldStart("aaData");

			for (LogEvent event : events) {
				generator.writeStartArray();

				generator.writeNumber(event.getLogEventId());
				generator.writeString(event.getPerson().getGivenName());
				generator.writeString(event.getPerson().getMiddleName());
				generator.writeString(event.getPerson().getFamilyName());
				generator.writeString(event.getEvent().getName());

				String dateCreated = simpleDateFormat.format(event.getDateCreated());
				generator.writeString(dateCreated);

				generator.writeEndArray();
			}

			generator.writeEndArray();

			generator.writeNumberField("sEcho", echo);
			generator.writeNumberField("iTotalRecords", eventCount);
			generator.writeNumberField("iTotalDisplayRecords", filtered);

			generator.writeEndObject();

			generator.close();
		}
	}

}
